package com.ruoyi.web.controller.wx;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.wx.SignUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;

/**
 * @author dingling
 * @desc wx相关
 * @date 2023-08-31 14:10
 **/

@Slf4j
@RestController
public class wxController {

    @GetMapping("/wx/auth")
    public void authPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        if (StringUtils.isNotBlank(request.getParameter("signature"))) {
            String signature = request.getParameter("signature");
            String timestamp = request.getParameter("timestamp");
            String nonce = request.getParameter("nonce");
            String echostr = request.getParameter("echostr");
            log.info("signature[{}], timestamp[{}], nonce[{}], echostr[{}]", signature, timestamp, nonce, echostr);
            if (SignUtil.checkSignature(signature, timestamp, nonce)) {
                log.info("数据源为微信后台，将echostr[{}]返回！", echostr);
                response.getOutputStream().println(echostr);
            }
        }
    }

//    @GetMapping("/wx/login")
//    public void weixinLogin(HttpServletRequest request, HttpServletResponse response) throws Exception {
//        // 用户同意授权后，能获取到code
//        String code = request.getParameter("code");//拿到code的值
//        logger.info("****************code:" + code);
//        // 用户同意授权
//
//        if (!"authdeny".equals(code)) {
//            // 获取网页授权access_token
//            Oauth2Token oauth2Token = getOauth2AccessToken(WxConstant.GZH_APP_ID, WxConstant.GZH_SECRET, code);
//            logger.info("***********************************oauth2Token信息：" + oauth2Token.toString());
//            // 网页授权接口访问凭证
//            String accessToken = oauth2Token.getAccessToken();
//            // 用户标识
//            String openId = oauth2Token.getOpenId();
//            // 获取用户信息
//            WxUserInfo wxUserInfo = getWxUserInfo(accessToken, openId);
//            logger.info("***********************************用户信息unionId：" + wxUserInfo.getUnionid() + "***:" + wxUserInfo.getNickname());
//            //到数据库查询 该 用户信息是否存在
//            int result = userService.queryIsExists(wxUserInfo.getUnionid());
//            if (result < 1) {//添加一条新的记录
//                User communityUser = new User();
//                communityUser.setNickName(wxUserInfo.getNickname());
//                communityUser.setOpenId(wxUserInfo.getOpenId());
//                communityUser.setUnionId(wxUserInfo.getUnionid());
//                result = userService.addUser(communityUser);
//                if (result > 0) {
//                    logger.info("绑定用户信息成功");
//                } else {
//                    logger.info("绑定用户信息失败");
//                }
//            } else {
//                // 这种情况出现：已关注->取关->再次关注(数据库肯定存在记录,此时重新删除,再次添加)
//                userService.delInfo(wxUserInfo.getUnionid());
//                User communityUser = new User();
//                communityUser.setNickName(wxUserInfo.getNickname());
//                communityUser.setOpenId(wxUserInfo.getOpenId());
//                communityUser.setUnionId(wxUserInfo.getUnionid());
//                result = userService.addUser(communityUser);
//                if (result > 0) {
//                    logger.info("绑定用户信息成功");
//                } else {
//                    logger.info("绑定用户信息失败");
//                }
//            }
//            // 设置要传递的参数
//            //具体业务start
//            logger.info("openId:" + openId);
//            //具体业务end
//            logger.info(wxUserInfo.toString());
//            //重定向到我们需要跳转的地址 由前端编写的h5页面 必须是部署到服务器上的
//            response.sendRedirect("跳转的网页地址");
//            return;
//        }
//        return;
//    }
//
//    /**
//     * 获取网页授权凭证
//     *
//     * @param appId     公众账号的唯一标识
//     * @param appSecret 公众账号的密钥
//     * @param code
//     * @return Oauth2Token
//     */
//    public static Oauth2Token getOauth2AccessToken(String appId, String appSecret, String code) {
//        Oauth2Token wat = null;
//        // 拼接请求地址
//        String requestUrl = WxConstant.AUTH_URL.replace("APPID", appId).replace("SECRET", appSecret).replace("CODE", code);
//        // 获取网页授权凭证
//        JSONObject jsonObject = JSON.parseObject(HttpUtil.get(requestUrl));
//        if (null != jsonObject) {
//            try {
//                wat = new Oauth2Token();
//                wat.setAccessToken(jsonObject.getString("access_token"));
//                wat.setExpiresIn(jsonObject.getInteger("expires_in"));
//                wat.setRefreshToken(jsonObject.getString("refresh_token"));
//                wat.setOpenId(jsonObject.getString("openid"));
//                wat.setScope(jsonObject.getString("scope"));
//            } catch (Exception e) {
//                wat = null;
//                int errorCode = jsonObject.getInteger("errcode");
//                String errorMsg = jsonObject.getString("errmsg");
//                log.error("获取网页授权凭证失败 errcode:{} errmsg:{}", errorCode, errorMsg);
//            }
//        }
//        return wat;
//    }
//
//    /**
//     * 通过网页授权获取用户信息
//     *
//     * @param accessToken 网页授权接口调用凭证
//     * @param openId      用户标识
//     * @return WxUserInfo
//     */
//    public static WxUserInfo getWxUserInfo(String accessToken, String openId) {
//        WxUserInfo wxUserInfo = null;
//        // 拼接请求地址
//        String requestUrl = WxConstant.GZH_USER_INFO.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
//        // 通过网页授权获取用户信息
//        JSONObject jsonObject = JSON.parseObject(HttpUtil.get(requestUrl));
//        if (null != jsonObject) {
//            try {
//                wxUserInfo = new WxUserInfo();
//                // 用户的标识
//                wxUserInfo.setOpenId(jsonObject.getString("openid"));
//                // 昵称
//                wxUserInfo.setNickname(jsonObject.getString("nickname"));
//                // 性别（1是男性，2是女性，0是未知）
//                wxUserInfo.setSex(jsonObject.getInteger("sex"));
//                // 用户所在国家
//                wxUserInfo.setCountry(jsonObject.getString("country"));
//                // 用户所在省份
//                wxUserInfo.setProvince(jsonObject.getString("province"));
//                // 用户所在城市
//                wxUserInfo.setCity(jsonObject.getString("city"));
//                // 用户头像
//                wxUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
//                // 用户特权信息
//                List<String> list = JSON.parseArray(jsonObject.getString("privilege"), String.class);
//                wxUserInfo.setPrivilegeList(list);
//                // 与开放平台共用的唯一标识，只有在用户将公众号绑定到微信开放平台帐号后，才会出现该字段。
//                wxUserInfo.setUnionid(jsonObject.getString("unionid"));
//                // 此处需要进入数据库  需要将 UnionId、openId 存入数据库
//            } catch (Exception e) {
//                wxUserInfo = null;
//                int errorCode = jsonObject.getInteger("errcode");
//                String errorMsg = jsonObject.getString("errmsg");
//                log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);
//            }
//        }
//        return wxUserInfo;
//    }

    /**
     * URL编码（utf-8）
     *
     * @param source
     * @return
     */
    public static String urlEncodeUTF8(String source) {
        String result = source;
        try {
            result = java.net.URLEncoder.encode(source, "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return result;
    }
}
